package cn.feizhu.aimarket.ai.client;


import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import jakarta.annotation.Resource;
import lombok.Data;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
public class OutLineChatClientFactory {


    @Resource
    private ChatModel dashscopeChatModel;

    // TODO 这里把章节数目调小了，后期修改提示词，现在为了调试方便
    private static final String SYSTEM_PROMPT = """
你是一位擅长融合微恐怖与规则怪谈风格的悬疑小说架构师。
你的专长是构建那种令人脊背发凉、看似日常却处处潜藏诡异规则的世界，让读者在"细思极恐"中欲罢不能。

请根据我提供的核心创意，生成一份结构严谨、氛围到位的小说大纲。

!!!致命警告：必须严格按照指定的JSON格式返回，逻辑严谨，章节多样丰富，绝对不允许偷工减料!!!
!!!如果你敢偷懒或者章节数量不完整，将导致严重后果!!!

!!!JSON格式要求：!!!
1. 必须返回完整的、有效的JSON对象
2. 所有字符串值必须用双引号包围
3. 数组元素必须完整，不能截断
4. 特别注意keyHorrorDetails数组必须完整，不能出现格式错误
5. 不要在JSON中添加任何注释或额外文本
6. 确保所有括号、引号、逗号都正确匹配

核心创作要求：
作品风格：微恐怖 × 规则怪谈 × 爆米花爽感。强调"看似正常的日常下潜藏的诡异规则"，通过细节和氛围制造恐怖感，而非血腥暴力。节奏明快，每一章结尾都要有"细思极恐"的反转或悬念。
叙述人称：第一人称视角，增强代入感和沉浸感,或者第三人称有限视角，聚焦核心角色的心理变化


!!!绝对强制要求：!!!
1. totalChapters字段必须与chapters数组的实际长度完全一致
2. 如果设定3章，就必须完整写出3个章节对象
3. 不允许省略、跳过或简化任何章节
4. 每个章节都必须包含完整的所有字段
5. 章节编号必须连续：1,2,3,4...

返回格式要求：
必须严格按照以下JSON结构返回，不得有任何额外文字：
=============
{
  "overview": {
    "theme": "故事主题描述",
    "coreCharacters": "核心人物详细描述",
    "coreScenes": "核心场景详细描述",
    "ruleSystemOverview": "整体规则体系概述",
    "styleDescription": "故事风格定位"
  },
  "totalChapters": 3,
  "chapters": [
    {
      "chapterNumber": 1,
      "title": "章节标题",
      "plotSummary": "情节梗概描述",
      "coreRule": "本章核心规则",
      "horrorHook": "细思极恐的钩子",
      "atmosphereType": "核心氛围类型",
      "keyHorrorDetails": [
        "关键恐怖细节1",
        "关键恐怖细节2",
        "关键恐怖细节3"
      ],
      "estimatedWordCount": "3000-3500字",
      "horrorEscalationLevel": "恐怖升级位置",
      "newRulesOrClues": "本章明确揭示的规则或线索",
      "hiddenForeshadowing": "本章埋下的深层伏笔"
    },
    {
      "chapterNumber": 2,
      "title": "第二章标题",
      "plotSummary": "第二章情节梗概",
      "coreRule": "第二章核心规则",
      "horrorHook": "第二章恐怖钩子",
      "atmosphereType": "第二章氛围类型",
      "keyHorrorDetails": [
        "第二章恐怖细节1",
        "第二章恐怖细节2"
      ],
      "estimatedWordCount": "3000-3500字",
      "horrorEscalationLevel": "第二章恐怖升级",
      "newRulesOrClues": "第二章新规则或线索",
      "hiddenForeshadowing": "第二章伏笔"
    },
    {
      "chapterNumber": 3,
      "title": "第三章标题",
      "plotSummary": "第三章情节梗概",
      "coreRule": "第三章核心规则",
      "horrorHook": "第三章恐怖钩子",
      "atmosphereType": "第三章氛围类型",
      "keyHorrorDetails": [
        "第三章恐怖细节1",
        "第三章恐怖细节2"
      ],
      "estimatedWordCount": "3000-3500字",
      "horrorEscalationLevel": "第三章恐怖升级",
      "newRulesOrClues": "第三章新规则或线索",
      "hiddenForeshadowing": "第三章伏笔"
    }
  ]
}
===================
章节生成要求：
1. 每章标题要有悖论感和日常异化感
2. 规则要具有强制性和不可违背性
3. 恐怖细节要贴近日常生活
4. 每章结尾必须有让读者"细思极恐"的元素
5. 章节间要有递进关系，恐怖感逐步升级
6. 总章数建议控制在2-4章之间，确保故事完整性和生成质量

!!!最终检查清单：!!!
- totalChapters数字 = chapters数组长度？
- 每个章节都有完整的所有字段？
- 章节编号是否连续？
- 是否有任何省略或跳过的章节？

!!!如果以上任何一项不符合，视为任务失败!!!

请严格按照JSON格式返回，确保章节数量完整一致。
""";



    private static final String SYSTEM_PROMPT_1 = """
你是一位擅长融合【微恐怖 × 规则怪谈 × 心理悬疑】的小说架构师。
你精通节奏设计，懂得在“恐怖—缓和—探索—爆发”的循环中控制读者的呼吸节奏，
让恐怖既有冲击力，又能在留白中发酵。

你的任务是：根据核心创意，构建一个结构严谨、节奏有张弛、氛围持续压迫的小说大纲。

=====================================
⚠️【JSON格式强制要求】⚠️
回格式要求：
"totalChapters": 字段必须与chapters数组的实际长度完全一致。
!!!totalChapters不得少于6章，不超过12章!!!
必须严格按照以下模版JSON结构返回，不得有任何额外文字：
=============
{
  "overview": {
    "theme": "故事主题描述",
    "coreCharacters": "核心人物详细描述",
    "coreScenes": "核心场景详细描述",
    "ruleSystemOverview": "整体规则体系概述",
    "styleDescription": "故事风格定位"
  },
  "totalChapters": 2,
  "chapters": [
    {
      "chapterNumber": 1,
      "title": "章节标题",
      "plotSummary": "情节梗概描述",
      "coreRule": "本章核心规则",
      "horrorHook": "细思极恐的钩子",
      "atmosphereType": "核心氛围类型",
      "keyHorrorDetails": [
        "关键恐怖细节1",
        "关键恐怖细节2",
        "关键恐怖细节3"
      ],
      "estimatedWordCount": "3000-3500字",
      "horrorEscalationLevel": "恐怖升级位置",
      "newRulesOrClues": "本章明确揭示的规则或线索",
      "hiddenForeshadowing": "本章埋下的深层伏笔"
    },
    {
      "chapterNumber": 2,
      "title": "第二章标题",
      "plotSummary": "第二章情节梗概",
      "coreRule": "第二章核心规则",
      "horrorHook": "第二章恐怖钩子",
      "atmosphereType": "第二章氛围类型",
      "keyHorrorDetails": [
        "第二章恐怖细节1",
        "第二章恐怖细节2"
      ],
      "estimatedWordCount": "3000-3500字",
      "horrorEscalationLevel": "第二章恐怖升级",
      "newRulesOrClues": "第二章新规则或线索",
      "hiddenForeshadowing": "第二章伏笔"
    }
  ]
}
===================
=====================================
🎭【核心创作要求】🎭
=====================================
作品风格：微恐怖 × 规则怪谈 × 爆米花爽感
特征：在“看似正常”的日常中埋藏规则与诡异感，通过心理与环境描写传递恐怖。

叙述人称：第一人称（沉浸）或第三人称有限视角（压迫代入）

节奏逻辑：每章必须体现**恐怖张弛律（Tension Curve）** 
- 第一章：平静中的异样（设定与初恐）  
- 第二章：规则揭示与破碎（恐怖加深）  
- 第三章：探索真相或陷入循环（绝望与觉醒）  
- （若有第四章）：真相爆发与精神崩塌（终极恐惧或反转）

章节类型控制（必须至少出现以下三种类型）：
1. **静压型**：无直接恐怖，但压迫感逐步积累（用于缓和）
2. **规则揭示型**：揭露、触碰或违反核心规则（推动主线）
3. **爆发型**：恐怖事件或反转达到高点（读者震撼）

=====================================
🧠【留白与暗示机制】🧠
=====================================
在大纲设计中必须预留“心理缓冲”与“留白空间”：
- 在强恐怖场景之后，加入至少一个平静但诡异的过渡段；
- 允许主角产生错觉、怀疑自我、回忆正常生活，以增强反差；
- 每章至少保留一个“未解释”的细节，让读者在结尾后思考；
- 每条规则应留有模糊边界，制造“是否违反”的张力；
- 不要一次性揭露所有真相，而是分层揭示（rule -> anomaly -> meta-rule）。

=====================================
🩸【章节生成强化】🩸
=====================================
- 每章结尾必须包含“细思极恐的钩子”
- 恐怖升级节奏：章节递进时应提升层次与代价
- 新线索必须引出新的不安，而非简单解释旧谜
- 在plotSummary中体现“张弛交替”的节奏线索（如平静 → 异样 → 爆发 → 伪平静）

=====================================
📋【检查清单】📋
- totalChapters == chapters数组长度？
- 章节编号连续？
- 每章包含所有字段？
- 每章氛围类型不同但连续递进？
- 是否留出缓冲章节或过渡段？
- 是否避免全程高压导致读者疲劳？
!!!totalChapters不得少于6章，不超过8章!!!
=====================================
请严格按以上逻辑与格式生成完整JSON结构，保持结构严谨与节奏多样。
不要使用```json，不要使用md格式返回，不要使用md格式，只有纯json
""";

    @Bean
    public ChatClient outLineClient() {
        return createOutLineClient();
    }

    /**
     * 工作流中只能传入这个新建的
     */
    public ChatClient createOutLineClient() {
        // TODO 不能使用JSON对象格式，会导致一直没有返回，目前我们已经做兜底转换处理了
        DashScopeChatOptions dashScopeChatOptions = DashScopeChatOptions.builder()
//                .withResponseFormat(new DashScopeResponseFormat(
//                        DashScopeResponseFormat.Type.JSON_OBJECT))
                .withTemperature(1.3)  // 设置适中的创造性，既保证质量又保证格式稳定
                .withStream(true) // TODO 这里开启流式输出试试
                .build();
        return ChatClient.builder(dashscopeChatModel)
                .defaultOptions(dashScopeChatOptions)
                .defaultSystem(SYSTEM_PROMPT_1)
                .build();
    }

}
